package com.dc.designPattern._18_memento.extend.extend3;


import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Originator {

    /**
     * 内部状态
     */
    private String state;

    /**
     * 创建一个备忘录
     * @return          备忘录对象
     */
    public IMemento createMemento() {
        return new Memento(this.state);
    }

    /**
     * 通过备忘录对象，恢复原始对象的状态
     * @param memento   备忘录对象
     */
    public void restoreMemento(IMemento memento) {
        this.state = ((Memento)memento).getState();
    }

    /**
     * 备忘录对象，实现备忘录接口（空接口）
     *  实现接口，是为了在外部可以建立对备忘录对象的引用。
     *  私有的内部类，其所有的属性和方法都是私有化的，保证属性和方法只有原始对象可以访问和处理
     */
    private class Memento implements IMemento {

        /**
         * 备份的内部状态
         */
        private String state;

        private Memento(String state) {
            this.state = state;
        }

        private String getState() {
            return state;
        }

        private void setState(String state) {
            this.state = state;
        }
    }
}
